
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

void func(int sig)
{
    std::cout << "接收子进程成功" << std::endl;

    pid_t rid = waitpid(-1, nullptr, 0);
    if (rid > 0)
    {
        //...
    }
}
void DoOtherThing()
{
    std::cout << "父进程执行其他任务" << std::endl;
    sleep(4);
}
int main()
{
    signal(SIGCHLD, func);

    pid_t id = fork();

    if (id == 0)
    {
        // child
        sleep(3);
        std::cout << "child excute" << std::endl;
        exit(1);
    }

    // father
    DoOtherThing();
    return 0;
}

// #include <iostream>
// #include <unistd.h>
// #include <signal.h>

// int gflag = 0;

// void changedata(int sig)
// {
//     std::cout << "get a signo" << sig << ", change gflag 0->1"<<std::endl;
//     gflag = 1;
// }
// int main() // main 函数中没有对gflag进行修改
// {
//     signal(2, changedata);

//     while (!gflag);

//     std::cout << "process quit normal" << std::endl;
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <signal.h>
// void excute()
// {
//     int *a = nullptr;
//     *a = 10;
// }
// void func(int sig)
// {
//     std::cout << "捕捉成功" << sig << "号信号" << std::endl;
//     sleep(1);
// }
// int main()
// {
//     signal(SIGSEGV, func);
//     excute();
//     return 0;
// }